package com.warm.spring.ioc;

import com.warm.spring.bean.equip.Equip;
import com.warm.spring.bean.equip.GunEquip;
import com.warm.spring.bean.hero.Hero;
import com.warm.spring.config.SpringConfig;
import com.warm.spring.util.SpringUtil;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.io.ClassPathResource;

/**
 * @Description bean loading...
 * @Author iyb-liangchuang
 * @Date 2021/5/18 9:27
 */
public class Client {



    public static void main(String[] args) {
        System.out.println("------------------------bean 装配----------------------------");
        /*ClassPathXmlApplicationContext xmlContext = new ClassPathXmlApplicationContext("spring.xml");
        Equip gunEquip = (Equip) xmlContext.getBean("gunEquip");
        System.out.println("Equip: " + gunEquip.equip());*/

        // 灵活变体: GenericApplicationContext + Reader 委托组合 --> 从不同配置源读取 bean 定义
        /*GenericApplicationContext genericContext = new GenericApplicationContext();
        new XmlBeanDefinitionReader(genericContext).loadBeanDefinitions("spring.xml"); // 这里可以使用不同的 Reader 读取配置源
        genericContext.refresh();
        Equip gunEquip1 = (Equip) genericContext.getBean("gunEquip");
        System.out.println("Equip: " + gunEquip1.equip());*/

        /**
         *  注意: 这里在 SpringConfig 中引入了 XML 的配置, 将 bean 都初始化在容器 AnnotationConfigApplicationContext
         *  不然 ClassPathXmlApplicationContext 和 AnnotationConfigApplicationContext 是两个不同容器, 各自管理自己的 bean
         */
        AnnotationConfigApplicationContext javaContext = new AnnotationConfigApplicationContext(SpringConfig.class); // JavaConfig + @ComponentScan
        //AnnotationConfigApplicationContext javaContext = new AnnotationConfigApplicationContext("com.warm.spring"); // 扫描指定包
        // 扫描注解 将 Bean 加载到 IOC 容器了
        Equip fistEquip = SpringUtil.getBean("fistEquip"); // SpringUtil 也是通过注解注入的, 也可以使用 XML
        System.out.println("Equip: " + fistEquip.equip());

        Equip gunEquip2 = SpringUtil.getBean("gunEquip");
        System.out.println("Equip: " + gunEquip2.equip());

        Equip swordEquip = (Equip) javaContext.getBean("swordEquip");
        System.out.println("Equip: " + swordEquip.equip());

        Hero saberHero = SpringUtil.getBean("saberHero");
        saberHero.figth();

        Hero xiaziHero = SpringUtil.getBean("xiaziHero");
        xiaziHero.figth();
    }
}
